#include<iostream>

#include"server.hpp"
#include <cstdarg>
#include<unistd.h>
#include<ctime>
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL DBG


// 可变参数宏：带时间戳、文件名、行号和格式控制
#define LOG(level,format, ...) do { \
    if(level<LOG_LEVEL) break;\
    time_t t = time(NULL); \
    struct tm* local = localtime(&t); \
    char time_str[20]; \
    strftime(time_str, sizeof(time_str), "%H:%M:%S", local); \
    /* 格式化字符串拼接：固定部分 + 用户传入的format + 换行 */ \
    fprintf(stdout, "[%s %s:%d] " format "\n", \
            time_str, __FILE__, __LINE__, ##__VA_ARGS__); \
} while(0)

#define INF_LOG(format, ...) LOG(INF, format, ##__VA_ARGS__)
#define DBG_LOG(format, ...) LOG(DBG, format, ##__VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ##__VA_ARGS__)

// 计算多个int的和，first是第一个固定参数（表示后续有多少个int）
int sum(int first, ...) {
    va_list ap;
    va_start(ap, first);  // 初始化参数列表，last参数是first
    
    int total = 0;
    for (int i = 0; i < first; i++) {
        total += va_arg(ap, int);  // 逐个提取int类型的参数
    }
    
    va_end(ap);  // 清理参数列表
    return total;
}

int main() 
{
    std::cout << sum(3, 10, 20, 30) << std::endl;  // 输出：60（3个参数：10+20+30）
    std::cout << sum(2, 5, 5) << std::endl;        // 输出：10（2个参数：5+5）


    int id = 1001;
    float score = 95.5;
    char name[] = "Alice";

    // 1. 输出整数（%d）
    LOG(ERR,"User ID: %d", id);  // 格式：整数

    // 2. 输出浮点数（%.1f 保留1位小数）
    LOG(INF,"Score: %.1f", score);  // 格式：控制小数位数

    // 3. 输出字符串（%s）和整数组合
    LOG(DBG,"User %s (ID: %d) passed", name, id);  // 格式：多参数组合

    // 4. 控制宽度和对齐（%8s 右对齐，宽度8）
    LOG(INF,"Name: %8s", name);  // 格式：控制字符串宽度

    Buffer a;
    for(int i=0;i<300;i++)
    {
        std::string s="hello cmz"+std::to_string(i)+'\n';
        a.WriteStringAndPush(s);
    }
    std::cout<<a.ReadAbleSize()<<std::endl;
    std::string temp;
    temp=a.ReadStringAndPop(a.ReadAbleSize());
    std::cout<<temp<<std::endl;
    std::cout<<a.ReadAbleSize()<<std::endl;
    // Buffer a;
    // a.WriteStringAndPush("cmzlw");
    // Buffer b;
    // b.WriteBufferAndPush(a);
    // std::string temp;
    // temp=b.ReadStringAndPop(b.ReadAbleSize());
    // // std::string temp;
    // // std::cout<<a.ReadAbleSize()<<std::endl;
    // // temp=a.ReadStringAndPop(a.ReadAbleSize());

    // std::cout<<temp<<std::endl;
    // std::cout<<a.ReadAbleSize()<<std::endl;
    // std::cout<<b.ReadAbleSize()<<std::endl;
    return 0;
    return 0;
}